package com.hf.db;

import java.sql.*;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * 封装JDBC
 * @author Healer
 */
public class DbProvider {
    /**
     * 连接服务器
     * @return connection对象
     */
    public Connection getConn() {
            Connection connection = null;
        try {
            //Class.forName("oracle.jdbc.driver.OracleDriver");
            Class.forName("com.mysql.cj.jdbc.Driver");
            //使用DriverSet的静态方法获取数据库连接
//            connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "scott", "a123456");
            connection = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/dzj?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Hongkong&allowPublicKeyRetrieval=true",
                    "root", "root");
        } catch (Exception e) {
            e.printStackTrace();
        }
            return connection;
    }

    /**
     * 使用查询器查询
     * @param sql
     * @return
     */
    public List<Map<String,Object>> requryListMap (String sql, Object... params){
        //创建List+Map集合对象
        List<Map<String,Object>> list = new ArrayList<>();

        try {
            //使用查询器查询返回结果集
            //Statement statement = getConn().createStatement();
            //resultSet = statement.executeQuery(sql);

            PreparedStatement preparedStatement = getConn().prepareStatement(sql);
            //给preparedStatement设置占位符的参数
            if (params != null && params.length > 0){
                //依次设置占位符的值
                for (int j = 1; j <= params.length; j++){
                    preparedStatement.setObject(j, params[j - 1]);
                }
            }
            ResultSet resultSet = preparedStatement.executeQuery();
            //将返回的结果集转存到list+Map集合中
            if (resultSet != null){
                //获取结果集中列的信息
                ResultSetMetaData rsmd = resultSet.getMetaData();
                //获取结果集中列的个数
                int columnCount = rsmd.getColumnCount();
                //遍历行数
                while (resultSet.next()){
                //每一行用一个Map集合保存
                    Map<String,Object> mapRow = new LinkedHashMap<>();
                //遍历当前行的列
                    for (int i = 1; i <= columnCount; i++){
                        //获取当前列的名字
                        String strColumnName = rsmd.getColumnName(i);
                        //通过列名获取对应的字段值
                        Object objColumnValue = resultSet.getObject(strColumnName);
                        //获取的 列名-字段值 以键-值 的形式存入Map中
                        mapRow.put(strColumnName, objColumnValue);
                    }
                    //将当前行的Map集合存入到List集合
                list.add(mapRow);
                }
            }
            preparedStatement.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        System.out.println("数据库连接成功！");
        return list;
    }

    /**
     * 增，删，改操作
     * @param strSql 查询语句
     * @param params 占位符参数
     * @return 数据库操作结果
     */
    public int idu(String strSql,Object... params){
    //返回结果集
        int i = 0;
        //创建占位符
        try {
            PreparedStatement preparedStatement = getConn().prepareStatement(strSql);
            //给preparedStatement设置占位符的参数
            if (params != null && params.length > 0){
                //依次设置占位符的值
                for (int j = 1; j < params.length; j++){
                    preparedStatement.setObject(j, params[j - 1]);
                }
            }
            //执行增删改操作
            i = preparedStatement.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return i;
    }
}


